package com.itheima.myreggie2.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.myreggie2.common.R;
import com.itheima.myreggie2.entity.Category;
import com.itheima.myreggie2.service.ICategoryService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 分类管理
 */
@Slf4j
@RestController
@RequestMapping("/category")
public class CategoryController {

    @Autowired
    ICategoryService categoryService;

    /**
     * 新增分类
     * 请求url地址： /category
     * 请求方式：POST
     * 请求参数：JSON格式的
     * 响应结果【格式统一】：R 对象
     */
    @PostMapping
    public R<String> addCategory(@RequestBody Category category) {
        log.info("category:{}", category);

        //调用业务层的添加方法
        categoryService.save(category);
        return R.success("添加成功");

    }

    /**
     * 分类分页 +条件  查询
     * 请求url地址： /category/page ?page=1&pageSize=10
     * 请求方式：GET
     * 请求参数：?page=1&pageSize=10
     * 响应结果【格式统一】：R 对象
     */
    @GetMapping("/page")
    public R<Page> queryByPage(Integer page, Integer pageSize) {
        //返回的是R 对象，里面放的是totals (总记录数) 和records（列表数据）

        //创建分页构造器     pageInfo 页面信息
        Page<Category> pageInfo = new Page<>(page, pageSize);

        //创建条件构造器
        LambdaQueryWrapper<Category> wrapper = new LambdaQueryWrapper<>();

        //这里可以添加一写条件  比如升序
        wrapper.orderByAsc(Category::getSort);

        //调用业务层执行查询
        categoryService.page(pageInfo,wrapper);

        return R.success(pageInfo);//这里不能传字符串了，上面的指定了泛型page
    }

    /**
     * 删除分类
     * 请求url地址： /category ?id=1504008529740996610
     * 请求方式：DELETE
     * 请求参数：?id=1504008529740996610
     * 响应结果【格式统一】：R 对象
     */

    /**
     *  注意的：不能直接调用业务层实现删除操作
     *           判断分类是否存在对应的菜品和套餐
     *           mp提供了上述的业务方法：
     *              自定义删除业务方法：
     *      当前的分类是1 菜品分类，还是2 套餐分类呢，若是菜品分类，
     *       需要查看下当前的分类对应的菜品有没有存在的菜品，套餐则有没有套餐，若都没有就直接删
     */

    @DeleteMapping
    public R<String> delete(Long id) {

         //1、检查当前分类下是否有对应的菜品
         // SELECT COUNT(*) FROM `dish` WHERE category_id = 1397844263642378242
        // 结果大于0 ，则不能删除  代码结束 return R.error("当前分类下有菜品，不能删除")

        //2、检查当前分类下是否有对应的套餐
        // SELECT COUNT(*) FROM `setmeal` WHERE category_id= 1397844263642378242
        //结果大于0 ，则不能删除  代码结束 return R.error("当前分类下有套餐，不能删除")
        // 3、可以删除,则调用mapper直接删除 categoryMapper.deleteById(id);


        //调用业务层自定义的删除操作方法  (先到业务层定义方法)
        boolean Result = categoryService.removeById(id);

        //判断：若这个Result为true,删除成功，Result为false,删除失败
        return Result ? R.success(null):R.error("无法删除分类，当前分类下存在菜品或者套餐");

    }
    /**
     * #### 修改分类
     * 接口一：根据id查询分类数据，进行数据回显【直接使用前端列表的当前行数据】 省略该接口！
     *
     * 接口二：修改分类
     *
     * 请求url地址： /category
     * 请求方式：PUT
     * 请求参数：JSON格式的数据
     * 响应结果【格式统一】：R 对象
     */
    @PutMapping
    public R<String> updateById(@RequestBody Category category){

        //调用业务层提供的修改方法
        categoryService.updateById(category);
        return R.success("更新成功");

    }
    /**    新增菜品功能开发
     *  接口1：查询菜品分类列表数据*
     *  请求url地址：/category/list ?type=1   怎么又回到category类呢？因为在新增页面里有个菜品分类的展示框
     *                 因此将新增写到categoryController中
     *  请求方式：GET
     * 请求参数：?type=1
     * 响应结果【格式统一】：R 对象
     *
     * // select * from category where type=1
     * // order by sort desc
     */
    @GetMapping("/list")
    public R<List> queryCategoryList(Integer type){
        //select * from category where type=1
        //select * from category where type=2
        //select * from category

        //创建条件构造器
        LambdaQueryWrapper<Category> wrapper = new LambdaQueryWrapper<>();
        //客户端做下判断type!=null
        wrapper.eq(type!=null,Category::getType,type);

        //调用业务层，查询菜品分类列表数据
        List<Category> list = categoryService.list(wrapper);//查询多个,用集合去接收

        return R.success(list);



    }


}
